#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 10000000000000000ll
const int maxn=2000000;
const int minn=-0x3f3f3f3f;
using namespace std;
ll w[maxn*4];
ll dy1[maxn*4];
ll add1[maxn*4];
ll a[maxn];
void pushup(int u){
    w[u]=max(w[u*2],w[u*2+1]);
}
void maketag(int u,ll dy,ll op,ll l,ll r){
   if(op==1){
    dy1[u]=dy;
    w[u]=dy;
    add1[u]=0;
   }
   if(op==2){
  if(dy1[u]==inf){
    add1[u]+=dy;
    
  }
  else{
    dy1[u]+=dy;
  }
  w[u]+=dy;
}
}
void pushdown(ll u,ll l,ll r){
    ll mid=(l+r)>>1;
    if(dy1[u]==inf){
        maketag(u*2,add1[u],2,l,mid);
        maketag(u*2+1,add1[u],2,mid+1,r);
        add1[u]=0;
    }
    else{
    maketag(u*2,dy1[u],1,l,mid);
    maketag(u*2+1,dy1[u],1,mid+1,r);
   dy1[u]=inf;
    }
}
void build(ll u,ll l,ll r){
    dy1[u]=inf;
    if(l==r){
        w[u]=a[l];
        return;
    }
    ll mid=(l+r)>>1;
     build(u*2,l,mid);
     build(u*2+1,mid+1,r);
     pushup(u);
}
ll inrange(ll L,ll R,ll l,ll r){
    return (l<=L)&&(R<=r);
}
ll outrange(ll L,ll R,ll l,ll r){
    return (L>r)||(R<l);
}
void xg(ll u,ll L,ll R,ll l,ll r,ll op,ll czs){
    if(inrange(L,R,l,r)){
        maketag(u,czs,op,L,R);
    }
    else {
        if(!outrange(L,R,l,r)){
        ll mid=(L+R)>>1;
        pushdown(u,L,R);
        xg(u*2,L,mid,l,r,op,czs);
        xg(u*2+1,mid+1,R,l,r,op,czs);
        pushup(u);
    }
    else return;
    }
}
ll cx(ll u,ll L,ll R,ll l,ll r){
    if(inrange(L,R,l,r)){
       return w[u];
    }
    else {
        if(!outrange(L,R,l,r)){
            pushdown(u,L,R);
            ll mid=(L+R)>>1;
            return max(cx(u*2,L,mid,l,r),cx(u*2+1,mid+1,R,l,r));
    }
    else return -inf;
    }
}
int main(){
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    build(1,1,n);
    for(int i=1;i<=q;i++){
        int x;
        scanf("%d",&x);
        if(x==3){
            int l,r;
              scanf("%d%d",&l,&r);
            printf("%d\n",cx(1,1,n,l,r));
        }
        else{
            int l,r,op;
             scanf("%d%d%d",&l,&r,&op);
            xg(1,1,n,l,r,x,op);
        }
    }
    return 0;
}